#define _USE_MATH_DEFINES

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <cassert>
#include <stack>
#include <cstdlib>
#include <bitset>
#include <cmath>

#define forn(i,n) for (int i = 0; i < int(n); ++i)
#define pb push_back
#define all(a) a.begin(),a.end()
#define sz(a) int(a.size())
#define mp make_pair

using namespace std;

typedef long long li;
typedef long double ld;

typedef pair<int,int> pt;
#define ft first
#define sc second

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld EPS = 1e-9;

string s;

//#define TASK_NAME ""

bool read() {
	if (!(cin >> s))
		return false;
	return true;
}

const int N = 500;
const int MOD = int(1e9);
int dp[N][N];

int calcdp(int l, int r) {
	if (l == r)
		return 1;

	if (l > r)
		return 0;

	int& res = dp[l][r];

	if (res != -1)
		return res;

	if (s[l] != s[r])
		return res = 0;

	res = calcdp(l + 1, r - 1);

	for (int i = l; i < r; ++i) {
		if (s[i] == s[l])
			res = (res + li(calcdp(l + 1, i - 1)) * calcdp(i, r)) % MOD;
	}

	return res;
}

void solve() {
	memset(dp, -1, sizeof(dp));

	cout << calcdp(0, sz(s) - 1) << endl;
}

int main() {
#ifdef TASK_NAME
	freopen(TASK_NAME ".in", "r", stdin);
	freopen(TASK_NAME ".out", "w", stdout);
#endif

#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	while (read())
		solve();

	return 0;
}